🐳 docker | August 21, 2021
도커 컴포즈를 사용해보고 익혀봅시다!
여러 컨테이너를 일괄적으로 정의하고 실행할 수 있는 툴
image
명령어를 통해 docker run
명령어처럼 바로 실행도 가능version
: compose 버전.
services
: 컴포즈를 이용해서 실행할 컨테이너 옵션을 정의build
: 빌드할 도커 파일의 위치image
: compose를 통해 실행할 이미지를 지정
run
명령어를 통해 image를 허브에서 바로 pull해서 돌리는 역할과 비슷command
: 컨테이너에서 실행될 명령어 지정port
: 컨테이너가 공개하는 포트를 나열link
: 다른 컨테이너와 연계할 때 연계할 컨테이너를 지정expose
: 포트를 링크로 연계된 컨테이너에게만 공개할 포트volumes
: 컨테이너에 볼륨을 마운드environment
: 컨테이너에 적용할 환경변수를 정의restart
: 컨테이너가 종료될 때 적용할 restart 정책
no
: default 값 - 재시작 되지 않음always
: 컨테이너를 수동으로 끄기 전까지 항상 재시작on-failure
: 오류가 있을 시에 재시작depends_on
: 컨테이너 간의 종속성을 정의, 정의한 컨테이너가 먼저 동작$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ docker-compose --version
Flask, Redis 컨테이너를 도커 컴포즈를 통해 실행시켜 봅시다.
실습 전 알아두기!
도커 컴포즈는 yml파일 위치가 있는 곳에서 실행을 해주어야 합니다.
따라서 디렉토리 생성 후, 도커 파일 정의, 컴포즈 파일 정의 및 실행을 하는 순서를 추천합니다.
$ mkdir composetest
$ cd composetest
cat > app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
cat > requirements.txt
flask
redis
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
version: '3.9'
services:
web:
build: .
ports:
- '5000:5000'
redis:
image: 'redis:alpine'
$ docker-compose config
$ docker-compose up
Flask, Redis 컨테이너를 통해 잘 실행된 모습입니다.
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
# ------추가--------
volumes:
- .:/code
environment:
FLASK_ENV: development
# -----------------
redis:
image: "redis:alpine"
$ docker-compose up -d
$ vi app.py
...
return Hello Docker!
...
scale
명령어를 통해 redis 컨테이너 늘리기$ docker-compose scale redis=3
run
명령어를 통해 docker exec
명령어처럼 명령 결과를 받아오기
wordpress와 mysql 컨테이너를 도커 컴포즈를 통해 실행시켜 봅시다.
wordpress의 동작 방식과 구성 내용은 도커 network 포스팅 or 공식 래퍼런스 참고
$ mkdir wordpress
$ cd wordpress
도커 컴포즈 [docker-compose.yml] 파일 생성
version: '3.9'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- '8080:80'
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
$ docker-compose up -d
볼륨 마운트를 확인
'/var/lib/docker/volumes/폴더명/볼륨명/_data'
형태로 표시가 됩니다.$ docker volume inspect 볼륨 데이터 이름
해당 경로로 진입해서 확인
도커 컴포즈 정리
--volumes
추가 옵션을 통해 볼륨마운트까지 정리된 모습$ docker-compose down --volume